IME onの時、キー入力をScrapboxに渡すUserScript
元ネタ:
2021-01-20 16:51:47 なんとか成功したみたい
ブラケティングだけ実装した
2023-11-08
08:53:25 終了
初回だけ「が残る
ほかは消えてくれる
たくさんタイプするとsleepが間に合わないかも
08:45:10 今度こそ成功
https://gyazo.com/b030ab7e426dd4d9eb012470efd1574c
2. 対象のキーであれば、ブラケティングボタンを押す。eventはcancelしない
3. 少し待ってから#text-inputのfocusを外す
5. 文字を消した後にfocusを戻す
08:24:39 だいぶうまくいくようになった
https://gyazo.com/25ea1a56ef6f1bc106cf628770e1b53b
<BS>の効果がなさそうだ
いや、これがないとIMEがおかしくなる
08:10:35 いや、失敗していた
blurのあとisTrusted===falseなcompositionendが発行されている
08:02:53 成功したかな?
chrome@windows11で確認
05:23:51 ずいぶん前から、キー入力を消せなくなっている
focusも外れるというオマケ付き
直したい
Known Issue
/icons/done.iconIMEに入力した文字を消せない
<ESC>を使えばIMEを強制終了できるのだが、不具合が発生するのでやりたくない
どんな不具合が起きたかは忘れた
工夫すればIMEを終了させられるのかもしれない
この前、終了できたのは何だったんだろうか?
22:02:17 方法見つけた!
code:script.ts
import { takeStores, press, sleep } from "../scrapbox-userscript-std/dom.ts";
const callback = (e: CompositionEvent) => {
if (!e.isTrusted) return;
if (e.data.length === 0) return;
if (!(e.target instanceof HTMLTextAreaElement)) return;
if (e.target.id !== "text-input") return;
const { cursor, selection } = takeStores();
if (!selection.hasSingleLineSelection()) return;
case "「": {
const button = document.getElementsByClassName('button link-button')?.0 if (!(button instanceof HTMLElement)) return;
//e.preventDefault();
//e.stopPropagation();
button.click();
const textarea = e.target;
(async () => {
await sleep(100);
textarea.blur();
await new Promise((resolve) => {
document.addEventListener("compositionend", resolve, { capture: true, once: true });
});
press("Backspace");
textarea.focus();
cursor.focus();
})();
break;
}
default:
break;
}
};
export const setup = (): () => void => {
document.addEventListener("compositionupdate", callback, { capture: true });
return () => {
document.removeEventListener("compositionupdate", callback, { capture: true });
};
};